首页 > 解决方案 > 在头文件中定义变量不会出错

问题描述

我正在编写一些代码来测试不应在头文件中定义该变量。但是,没有任何错误。我就是想不通。

请告诉我为什么我运行时没有发生错误build.bat。该变量在头文件中定义,该文件包含在两个源文件中。

CMake项目的结构是:

--build  
--include  
----module1.h  
--script  
----build.bat  
--src  
----Main.cpp  
----module1.cpp  
----CMakeLists.txt  
--CMakeLists.txt  

的内容include/module1.h是:

int a = 1;

的内容src/module1.cpp是:

#include "module1.h"

的内容src/Main.cpp是:

#include "module1.h"

CMakeLists.txt根目录下的内容为:

cmake_minimum_required(VERSION 3.0)

PROJECT(ProjectExample VERSION 0.1.0)

SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_FLAGS "-Wno-deprecated-declarations")

ENABLE_TESTING()
ADD_SUBDIRECTORY(src)

的内容src/CMakeLists.txt是:

SET(INCLUDE ${CMAKE_SOURCE_DIR}/include)

FILE(GLOB SOURCE "*.cpp")
LIST(REMOVE_ITEM SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp)

ADD_COMPILE_OPTIONS("-g")
ADD_COMPILE_OPTIONS("-Wall")
ADD_LIBRARY(hello ${SOURCE})

TARGET_INCLUDE_DIRECTORIES(hello PUBLIC "${INCLUDE}")
ADD_EXECUTABLE(main ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp)
TARGET_LINK_LIBRARIES(main hello)

的内容script/build.bat是:

@echo off
pushd .

if not exist build (
     md build
)

cd build
cmake -G"MinGW Makefiles" ..
mingw32-make.exe

popd

标签: c++variablescmakedefinition

解决方案


首先,忘记头文件。那是一种分心。本质上,问题在于有两个定义相同名称的源文件:

// file1.cpp
int a = 1;

// file2.cpp
int a = 1;

问题是,为什么编译和链接这段代码不会出错?

技术上的答案是,这样的重新定义违反了单一定义规则 (ODR),并且违反 ODR 不需要诊断。

在实践中,函数的重复定义会给出错误消息。数据的重复定义有时不会。

如果你幸运的话,当你运行它时,代码将会失败。如果你不走运,它会在你的整个测试过程中正常工作,当你向最重要的客户提供演示时它会崩溃。


推荐阅读